"""
热传递计算模块

包含各种传热模式的计算：
- 单相对流换热
- 核态沸腾换热
- 过冷核态沸腾
- 包壳导热
"""

import numpy as np
from ..models.fluid_properties import FluidProperties

class HeatTransfer:
    """热传递计算类"""
    
    def __init__(self, channel_diameter):
        """
        初始化热传递计算器
        
        参数：
        channel_diameter: float, 子通道等效直径 (m)
        """
        self.d = channel_diameter
        self.fluid_props = FluidProperties()
    
    def calculate_single_phase_htc(self, pressure, temperature, velocity, phase):
        """
        计算单相对流换热系数
        
        参数：
        pressure: float, 压力 (Pa)
        temperature: float, 温度 (K)
        velocity: float, 流体速度 (m/s)
        phase: str, 相态 ('liquid' 或 'vapor')
        
        返回：
        float, 换热系数 (W/m²·K)
        """
        # 获取流体物性
        props = self.fluid_props.get_properties(pressure, temperature, phase)
        if props is None:
            return 0.0
            
        # 计算无量纲准数
        Re = props['density'] * abs(velocity) * self.d / props['viscosity']
        Pr = props['cp'] * props['viscosity'] / props['conductivity']
        
        # 使用Dittus-Boelter关联式
        if Re < 2300:  # 层流
            Nu = 3.66  # 假设充分发展的层流
        else:  # 湍流
            if phase == 'liquid':
                n = 0.4  # 加热
            else:
                n = 0.3  # 冷却
            Nu = 0.023 * Re**0.8 * Pr**n
            
        # 计算换热系数
        h = Nu * props['conductivity'] / self.d
        return h
    
    def calculate_subcooled_boiling_htc(self, wall_temp, sat_temp, liquid_temp, pressure):
        """
        计算过冷核态沸腾换热系数
        
        参数：
        wall_temp: float, 壁面温度 (K)
        sat_temp: float, 饱和温度 (K)
        liquid_temp: float, 液相温度 (K)
        pressure: float, 压力 (Pa)
        
        返回：
        float, 换热系数 (W/m²·K)
        """
        # Chen关联式的修正系数
        F_chen = 0.5  # 气泡冷凝系数
        
        # 计算过热度
        delta_T_sat = wall_temp - sat_temp
        delta_T_sub = sat_temp - liquid_temp
        
        # 计算沸腾抑制因子
        S = 1 / (1 + 2.53e-6 * (delta_T_sub/delta_T_sat)**1.17)
        
        # 计算核态沸腾换热系数
        h_nb = self.calculate_nucleate_boiling_htc(wall_temp, sat_temp, pressure)
        
        # 计算单相对流换热系数
        h_fc = self.calculate_single_phase_htc(pressure, liquid_temp, 1.0, 'liquid')
        
        # 综合换热系数
        h = F_chen * h_nb * S + h_fc
        return h
    
    def calculate_nucleate_boiling_htc(self, wall_temp, sat_temp, pressure):
        """
        计算饱和核态沸腾换热系数
        
        参数：
        wall_temp: float, 壁面温度 (K)
        sat_temp: float, 饱和温度 (K)
        pressure: float, 压力 (Pa)
        
        返回：
        float, 换热系数 (W/m²·K)
        """
        # 获取流体物性
        props_l = self.fluid_props.get_properties(pressure, sat_temp, 'liquid')
        if props_l is None:
            return 0.0
            
        # 计算过热度
        delta_T_sat = wall_temp - sat_temp
        
        # 获取汽化潜热
        h_fg = self.fluid_props.get_latent_heat(pressure)
        if h_fg is None:
            return 0.0
            
        # 获取表面张力
        sigma = self.fluid_props.get_surface_tension(sat_temp)
        if sigma is None:
            return 0.0
            
        # 使用Rohsenow关联式
        C_sf = 0.013  # 表面-流体组合系数
        s = 1.0       # 流体相关系数
        
        h = props_l['cp'] * delta_T_sat / (
            C_sf * h_fg * (
                sigma/(9.81 * (props_l['density'] - props_l['density']/1000)
            ))**0.5 * (
                props_l['cp'] * delta_T_sat/(h_fg * props_l['viscosity'])
            )**s
        )
        return h
    
    def calculate_wall_conduction(self, T_inner, T_outer, thickness, conductivity):
        """
        计算壁面导热
        
        参数：
        T_inner: float, 内壁面温度 (K)
        T_outer: float, 外壁面温度 (K)
        thickness: float, 壁厚 (m)
        conductivity: float, 导热系数 (W/m·K)
        
        返回：
        float, 热流密度 (W/m²)
        """
        q = conductivity * (T_inner - T_outer) / thickness
        return q
    
    def calculate_radial_heat_conduction(self, temperatures, dr, r):
        """
        计算径向热传导
        
        参数：
        temperatures: array, 径向温度分布 (K)
        dr: float, 径向网格间距 (m)
        r: array, 径向位置 (m)
        
        返回：
        array, 径向温度梯度 (K/m)
        """
        d2T_dr2 = np.zeros_like(temperatures)
        
        # 使用中心差分格式
        for i in range(1, len(temperatures)-1):
            d2T_dr2[i] = (1/r[i]) * (
                (r[i+1]*temperatures[i+1] - r[i]*temperatures[i])/dr -
                (r[i]*temperatures[i] - r[i-1]*temperatures[i-1])/dr
            )/dr
            
        return d2T_dr2 